/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package gestor.base.de.datos;

import java.util.*;
import java.io.*;

/**
 *
 * @author Ana Silvia Gonzáles
 * @author Diego Enríquez
 * 
 */


public class DataBase implements Serializable{
    
    private Map<String,Table> tables;
    private String name;
    private boolean ini;
    
    public DataBase(String name)
    {
        this.name=name.toUpperCase();
        this.tables=new HashMap<>();     
        ini=false;
        
    }

    public void setIni(boolean ini) {
        this.ini = ini;
    }

    public boolean isIni() {
        return ini;
    }
    
    public String getName()
    {
        return this.name;
    }
    
    public Map<String,Table> getTables()
    {
        return this.tables;
    }
    
    public void setName(String name)
    {
        this.name=name.toUpperCase();
    }
    
    public void setTables(Map<String,Table> tables)
    {
        this.tables=tables;
    }

    /**
     * Elimina la tabla con el nombre indicado
     * @param name
     * @return true si pudo eliminarla, false si no
     */
    public boolean dropTable(String tabla)
    {
        boolean resp=true;
        
        if(tables.containsKey(tabla))
        {
            if(tables.get(tabla).getForeign()==0)
            {
                Table tablaActual=tables.get(tabla);
                for (String key : tablaActual.getConstraints().keySet()) {
                    if (tablaActual.getConstraints().get(key).getKeys().size() > 0) {
                        ArrayList<Key> keys = tablaActual.getConstraints().get(key).getKeys();
                        for (int i = 0; i < keys.size(); i++) {
                            if ((keys.get(i).getTipo() == 2)) {
                                tables.get(keys.get(i).getRefDataBase()).lessForeign(keys.get(i).getRefCol());
                            }
                        }
                    }
                }
                
                tables.remove(tabla);
            }
            else
            {
                gui.GUI.error("\nNO PUEDE ELIMINAR UNA TABLA QUE TIENE REFERENCIAS FORANEAS DESDE OTRAS TABLAS");
            }
        }
        else
        {
            resp=false;
            gui.GUI.error("No existe la tabla "+tabla);
        }
        
        return resp;
        
    }
    
    /**
     * Agrega una tabla a la base de datos
     * @param name
     * @return true si la tabla no existía y se agregó, false si ya existía
     */
    public boolean addTable(String name)
    {
        
        boolean resp=true;
        
        if(!tables.containsKey(name.toUpperCase()))
        {
            Table nueva=new Table(name.toUpperCase());
            tables.put(name.toUpperCase(), nueva);
        }
        else {
            resp=false;
            gui.GUI.error("Ya existe la tabla "+name);
        }
        
        return resp;
        
    }
    
    /**
     * Revisa si la base de datos contiene una table con el nombre en name
     * @param name
     * @return true si contiene la tabla, false si no
     */
    public boolean checkExists(String name)
    {
        
        boolean resp;
        
        resp=tables.containsKey(name);
        
        return resp;
        
    }
    
    
    public Table getTable(String name)
    {
        
        Table resp;
        if(tables.containsKey(name.toUpperCase())) {
            resp=tables.get(name.toUpperCase());
        }
        else {
            resp=null;
        }
        
        return resp;
        
    }
    
    /**
     * Muestra la tabla especificada
     * @param name
     * @return String con la tabla
     */
    public String showTable(String name)
    {
        String resp="";
        
        if(tables.containsKey(name.toUpperCase())) {
            resp=tables.get(name.toUpperCase()).showTable();
        }
        else
        {
            gui.GUI.error("No existe la tabla "+name);
        }
        
            
        return resp;
            
    }
    
    /**
     * Muestra el listado de todas las tablas de la data base
     * @return 
     */
    public String showTables()
    {
        
        String resp="";
        
        for(String key:tables.keySet()) {
            resp+=tables.get(key).getName()+"\n";
        }
            
        
        return resp;
        
    }
    
    
    /**
     * Cambia el nombre de una database
     * @param oldName
     * @param newName
     * @return true si lo cambia, de lo contrario false
     */
    public boolean alterTable(String oldName, String newName)
    {
        
        boolean resp=true;
        
        if(tables.containsKey(oldName))
        {
            if(tables.containsKey(newName))
            {
                resp=false;
                gui.GUI.error("Ya existe una tabla con el nombre "+newName);
            }
            else
            {
                if(tables.get(oldName).getForeign()==0)
                {
                    tables.get(oldName).setName(newName);
                    tables.put(newName, tables.get(oldName));
                    tables.remove(oldName);
                    //gui.GUI.error("\nLA TABLA "+oldName.toUpperCase()+" HA SIDO RENOMBRADA A "+newName.toUpperCase());
                }
                else
                {
                    resp=false;
                    gui.GUI.error("No puede cambiar el nombre de una tabla a la que se le hace referencia");
                }
            }
        }
        else
        {
            resp=false;
            gui.GUI.error("No existe la tabla "+oldName);
        }
        
        return resp;
        
    }
    
}
